#!/usr/bin/env python3
"""
libX11 MCP Server

面向 libX11 库的 MCP server，提供编译和测试相关的命令行工具。

MCP tools 列表：
- libx11_compile_test: 编译链接 libX11 的 C 程序并验证生成的可执行文件
  参数：source_file (C 源文件路径), output_file (输出可执行文件路径)
  返回：统一的 JSON 结构，包含编译和验证结果
"""

from mcp.server.fastmcp import FastMCP, Context
import subprocess
import os
from typing import Dict, Any

mcp = FastMCP("libX11 MCP Server")

@mcp.tool()
def libx11_compile_test(source_file: str, output_file: str) -> Dict[str, Any]:
    """
    编译链接 libX11 的 C 程序并验证生成的可执行文件
    
    参数:
        source_file: C 源文件的完整路径
        output_file: 编译后生成的可执行文件路径
        
    返回:
        {
            "success": bool,      # 整体操作是否成功
            "command": str,       # 执行的命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出
            "stderr": str         # 标准错误
        }
    """
    # 编译命令
    compile_command = ["gcc", "-Wall", "-O2", source_file, "-o", output_file, "-lX11"]
    
    # 执行编译
    compile_result = subprocess.run(compile_command, capture_output=True, text=True)
    
    # 检查编译是否成功
    if compile_result.returncode == 0:
        # 检查生成的可执行文件是否存在
        file_check_command = ["test", "-e", output_file]
        file_check_result = subprocess.run(file_check_command, capture_output=True, text=True)
        
        # 整体成功条件：编译成功且文件存在
        overall_success = compile_result.returncode == 0 and file_check_result.returncode == 0
        
        return {
            "success": overall_success,
            "command": " && ".join([" ".join(compile_command), " ".join(file_check_command)]),
            "exit_code": compile_result.returncode if compile_result.returncode != 0 else file_check_result.returncode,
            "stdout": compile_result.stdout + "\n" + file_check_result.stdout,
            "stderr": compile_result.stderr + "\n" + file_check_result.stderr
        }
    else:
        return {
            "success": False,
            "command": " ".join(compile_command),
            "exit_code": compile_result.returncode,
            "stdout": compile_result.stdout,
            "stderr": compile_result.stderr
        }

if __name__ == "__main__":
    mcp.run()